home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1992 June: ROMin Holiday / ADC Developer CD (1992-06) (''ROMin Holiday'')_iso / Developer Connection - 06-1992.iso / Developer Essentials / DTS Sample Code / Snippets / Toolbox & IAC / Sound / Double Buffer / DoubleBuffer.cp < prev   
Encoding:
Text File  |  1991-05-06  |  3.0 KB  |  124 lines  |  [TEXT/MPS ]

  1. #include    <Resources.h>
  2. #include    <Sound.h>
  3. #include    <Memory.h>
  4.  
  5. #define    TRUE            0xFF
  6. #define    FALSE            0
  7. #define kDoubleBufferSize    0x1000
  8.  
  9. struct LocalVars {
  10.     long    bytesTotal;
  11.     long    bytesCopied;
  12.     Ptr        dataPtr;
  13. };
  14.  
  15. typedef struct LocalVars LocalVars;
  16. typedef LocalVars *LocalVarsPtr;
  17.  
  18. pascal void MyDoubleBackProc (SndChannelPtr channel,
  19.                                             SndDoubleBufferPtr doubleBufferPtr);
  20.  
  21. main()
  22. {
  23. SndDoubleBufferHeader    doubleHeader;
  24. SndDoubleBufferPtr        doubleBuffer;
  25. int                        i;
  26. OSErr                    err;
  27. SCStatus                Stats;
  28. SndChannelPtr            chan;
  29. SoundHeaderPtr            Head;
  30. Handle                    SoundData;
  31. LocalVars                myVars;
  32.  
  33. SoundData = GetResource ('snd ', 100);
  34. if (ResError() != noErr || SoundData == nil)
  35.     Debugger();
  36. HLock (SoundData);
  37.  
  38. chan = nil;
  39. err = SndNewChannel (&chan, sampledSynth, 0, nil);
  40. if (err != noErr)
  41.     Debugger();
  42.     
  43. Head = (SoundHeaderPtr) NewPtrClear (sizeof(SoundHeader));
  44. Head->samplePtr = *SoundData;
  45. Head->length = 45838;
  46. Head->sampleRate = 0x56EE8BA3;        //recorded at 22KHz
  47. Head->loopStart = 0;
  48. Head->loopEnd = 0;
  49. Head->encode = 0;
  50. Head->baseFrequency = 60;
  51. Head->sampleArea[0] = 0;
  52.  
  53. myVars.bytesTotal = Head->length;
  54. myVars.bytesCopied = 0;
  55. myVars.dataPtr = Head->samplePtr;
  56.  
  57. doubleHeader.dbhNumChannels = 1;
  58. doubleHeader.dbhSampleSize = 8;
  59. doubleHeader.dbhCompressionID = 0;
  60. doubleHeader.dbhPacketSize = 0;
  61. doubleHeader.dbhSampleRate = Head->sampleRate;
  62. doubleHeader.dbhDoubleBack = (SndDoubleBackProcPtr) &MyDoubleBackProc;
  63.  
  64. for (i = 0; i <= 1; ++i) {
  65.     doubleBuffer = (SndDoubleBufferPtr) NewPtrClear (sizeof(SndDoubleBuffer) + kDoubleBufferSize);
  66.     
  67.     if (doubleBuffer == nil || MemError() != 0)
  68.         Debugger();
  69.         
  70.     doubleBuffer->dbNumFrames = 0;
  71.     doubleBuffer->dbFlags = 0;
  72.     doubleBuffer->dbUserInfo [0] = (long) &myVars;
  73.     
  74.     MyDoubleBackProc (chan, doubleBuffer);            // initialize the buffers
  75.     
  76.     doubleHeader.dbhBufferPtr [i] = doubleBuffer;
  77.     }
  78.     
  79. err = SndPlayDoubleBuffer (chan, &doubleHeader);
  80. if (err != noErr)
  81.     Debugger();
  82.     
  83. do {
  84.     err = SndChannelStatus (chan, sizeof (Stats), &Stats);
  85.     } while (Stats.scChannelBusy);
  86.         
  87. for (i = 0; i <= 1; ++i)
  88.     DisposePtr ((Ptr) doubleHeader.dbhBufferPtr[i]);
  89.  
  90. err = SndDisposeChannel (chan,FALSE);
  91. if (err != noErr)
  92.     Debugger();
  93.         
  94. HUnlock (SoundData);
  95. }
  96. /**********************************/
  97.  
  98. pascal void MyDoubleBackProc (SndChannelPtr chan,SndDoubleBufferPtr doubleBuffer)
  99. {
  100. LocalVarsPtr    myVarsPtr;
  101. long            bytesToCopy;
  102.  
  103. myVarsPtr = (LocalVarsPtr) doubleBuffer->dbUserInfo[0];
  104. bytesToCopy = myVarsPtr->bytesTotal - myVarsPtr->bytesCopied;
  105.  
  106. if (bytesToCopy > kDoubleBufferSize)
  107.     bytesToCopy = kDoubleBufferSize;
  108.     
  109. BlockMove (myVarsPtr->dataPtr, &doubleBuffer->dbSoundData[0], bytesToCopy);
  110.  
  111. doubleBuffer->dbNumFrames = bytesToCopy;
  112. doubleBuffer->dbFlags = (doubleBuffer->dbFlags) | dbBufferReady;
  113.  
  114. myVarsPtr->dataPtr = (Ptr) ((myVarsPtr->dataPtr) + bytesToCopy);
  115. myVarsPtr->bytesCopied = myVarsPtr->bytesCopied + bytesToCopy;
  116.  
  117. if (myVarsPtr->bytesCopied == myVarsPtr->bytesTotal)
  118.     doubleBuffer->dbFlags = (doubleBuffer->dbFlags) | dbLastBuffer;
  119.     
  120. return;
  121. }
  122.  
  123. /**********************************/
  124.